package com.guomei.service.exam;

import com.guomei.bean.exam.domain.ExamEnroll;
import com.guomei.bean.exam.domain.ExamEnrollDTO;
import com.guomei.utils.Result;

import java.util.List;

/**
 * 考试报名服务接口
 */
public interface ExamEnrollService {
    
    /**
     * 根据ID查询
     */
    ExamEnroll getById(Long id);
    
    /**
     * 查询所有
     */
    List<ExamEnroll> getAll();
    
    /**
     * 条件查询（分页）
     */
    Result<?> getByCondition(ExamEnroll examEnroll);
    
    /**
     * 新增
     */
    boolean save(ExamEnroll examEnroll);
    
    /**
     * 批量新增
     */
    boolean batchSave(List<ExamEnroll> examEnrolls);
    
    /**
     * 更新
     */
    boolean update(ExamEnroll examEnroll);
    
    /**
     * 根据ID删除
     */
    boolean removeById(Long id);
    
    /**
     * 批量删除
     */
    boolean batchRemove(List<Long> ids);
    
    /**
     * 根据考试ID查询
     */
    List<ExamEnroll> getByExamId(Long examId);
    
    /**
     * 根据用户ID查询
     */
    List<ExamEnroll> getByUserId(Long userId);
    
    /**
     * 根据考试ID和用户ID查询
     */
    ExamEnroll getByExamIdAndUserId(Long examId, Long userId);
    
    /**
     * 根据考试ID和身份证号查询
     */
    ExamEnroll getByExamIdAndIdCard(Long examId, String idCard);
    
    /**
     * 根据考试ID和手机号查询
     */
    ExamEnroll getByExamIdAndPhone(Long examId, String phone);
    
    /**
     * 根据订单编号查询
     */
    ExamEnroll getByOrderNo(String orderNo);
    
    /**
     * 根据考试ID删除
     */
    boolean removeByExamId(Long examId);
    
    /**
     * 根据用户ID删除
     */
    boolean removeByUserId(Long userId);
    
    /**
     * 统计用户报名次数
     */
    int countByUserIdAndExamId(Long userId, Long examId);
    
    /**
     * 统计考试报名人数
     */
    int countByExamId(Long examId);
    
    /**
     * 考试报名（包含验证逻辑）
     */
    Result<?> enrollExam(ExamEnrollDTO examEnrollDTO);
    
    /**
     * 更新支付状态
     */
    boolean updatePaymentStatus(String orderNo, Short payStatus, Short payType, String tradeNo, String wxNo);
    
    /**
     * 根据订单号更新微信交易号
     */
    boolean updateWxNoByOrderNo(String orderNo, String wxNo);
    
    /**
     * 验证报名资格
     */
    Result<?> validateEnrollQualification(Long examId, Long userId);
    
    /**
     * 支付成功回调
     */
    Result<?> paySuccess(String orderNo);
    
    /**
     * 取消报名（根据考试ID和用户ID）
     */
    Result<?> cancelEnroll(Long examId, Long userId);
    
    /**
     * 取消报名（根据订单号）
     */
    Result<?> cancelEnrollByOrderNo(String orderNo);
    
    /**
     * 软删除报名记录（客户端删除）
     */
    boolean softDeleteEnroll(String orderNo);

    /**
     * 根据订单号获取报名详情
     */
    Result<?> getOrderDetail(String orderNo);
}
